﻿using System;
using System.Collections.Generic;
using System.Linq;
using Entidades;

namespace AccesoADatos
{
	public class AuxiliarRespuesta
	{
		#region Constructor

		EvaluacionEntities _context;

		public AuxiliarRespuesta()
		{
			_context = new EvaluacionEntities();
			_context.ContextOptions.ProxyCreationEnabled = false;
		}

		#endregion

		#region Métodos

		#region Agregar

		public Respuesta Agregar(Respuesta respuesta)
		{
			try
			{
				_context.Respuestas.AddObject(respuesta);
				_context.SaveChanges();
			}
			catch (Exception ex)
			{
				throw (ex);
			}
			return respuesta;
		}

		#endregion

		#region Modificar

		public void Modificar(Respuesta respuesta)
		{
			try
			{
				_context.Respuestas.Attach(respuesta);
				_context.ObjectStateManager.ChangeObjectState(respuesta, System.Data.EntityState.Modified);
				_context.SaveChanges();
			}
			catch (Exception ex)
			{
				throw (ex);
			}
		}

		#endregion

		#region Eliminar

		public void Eliminar(Respuesta respuesta)
		{
			try
			{
				_context.Respuestas.Attach(respuesta);
				_context.Respuestas.DeleteObject(respuesta);
				_context.SaveChanges();
			}
			catch (Exception ex)
			{
				throw (ex);
			}
		}

		#endregion

		#region Listar

		public List<Respuesta> Listar(string examenClave = "", short habilidadId = 0, short preguntaId = 0, byte consecutivo = 0)
		{
			List<Respuesta> resultado = new List<Respuesta>();
			try
			{
				var q = from c in _context.Respuestas
								where
									(examenClave == "" || c.ExamenesClave == examenClave) &&
									(habilidadId == 0 || c.HabilidadesId == habilidadId) &&
									(preguntaId == 0 || c.PreguntasId == preguntaId) &&
									(consecutivo == 0 || c.Consecutivo == consecutivo)
								select c;

				resultado = q.ToList();
			}
			catch (Exception ex)
			{
				throw (ex);
			}
			return resultado;
		}

		#endregion

		#region Obtener
				
		public List<RespuestaAleatoria> Obtener(string examenClave, short habilidadId, short preguntaId)
		{
			List<RespuestaAleatoria> resultado = new List<RespuestaAleatoria>();
			try
			{
				var aleatoriedad = new Random((int)DateTime.UtcNow.Ticks);
				
				var q = 
					_context.Respuestas
						.Where(c =>
							c.ExamenesClave == examenClave &&
							c.HabilidadesId == habilidadId &&
							c.PreguntasId == preguntaId)
						.AsEnumerable()
						.OrderBy(c => aleatoriedad.Next())
						.Select(c => new RespuestaAleatoria()
						{
							Consecutivo = c.Consecutivo,
							Enunciado = c.Descripcion,
							TipoRespuesta = _context.Preguntas
								.Where(p =>
									p.ExamenesClave == c.ExamenesClave && 
									p.HabilidadesId == c.HabilidadesId && 
									p.Id == c.PreguntasId)
								.Select(p => 
									p.ConsecutivosRespuestasCorrecta).First().Length == 1 ? 
										"RadioButton" : 
										"CheckBox"
						}); 

				resultado = q.ToList();
			}
			catch (Exception ex)
			{
				throw (ex);
			}
			return resultado;
		}

		#endregion 

		#endregion
	}
}
